import store from '@/store'
import { parseTime } from '@/utils/index'
import { v4 as uuidv4 } from 'uuid'
const OSS = require('ali-oss')

/**
 * 阿里云oss sdk文件上传
 * @param {*} dir 上传文件夹路径
 * @param {*} file 文件流
 * @param {*} successCallback 成功回调
 * @param {*} errCallBack 失败回调
 */
export async function bucketUpload(dir, file, successCallback = new Function(), errCallBack = new Function()) {
    let data = {}
    const time = new Date().getTime()
    // 先获取上传token
    const ossToken = store.getters.ossToken
    if (ossToken.tokenTime) {
        // console.warn('time', time, ossToken.tokenTime);
        if (time - ossToken.tokenTime > 50 * 60 * 1000) { //超过50分钟则重新获取token
            data = await store.dispatch('user/getOssToken')
        } else {
            data = ossToken
        }
    } else {
        data = await store.dispatch('user/getOssToken')
    }
    // 实例化一个上传客户端
    const client = new OSS({
        // 填写Bucket名称。
        bucket: data.bucketName,
        // yourRegion填写Bucket所在地域。Region填写为oss-cn-hangzhou。
        region: data.ossRegion,
        // 从STS服务获取的临时访问密钥（AccessKey ID和AccessKey Secret）。
        accessKeyId: data.accessKeyId,
        accessKeySecret: data.accessKeySecret,
        // 从STS服务获取的安全令牌（SecurityToken）。
        stsToken: data.securityToken,
        refreshSTSTokenInterval: 50 * 1000 * 1000 //token过期时间
    })

    try {
        // 填写Object完整路径。Object完整路径中不能包含Bucket名称。
        // 您可以通过自定义文件名（例如exampleobject.txt）或文件完整路径（例如exampledir/exampleobject.txt）的形式实现将数据上传到当前Bucket或Bucket中的指定目录。
        // data对象可以自定义为file对象、Blob数据或者OSS Buffer。

        // 为保证唯一性，通过uuid将文件名替换
        const fileName = file.name
        const uuid = uuidv4() + fileName.substring(fileName.lastIndexOf('.'))
        const d = parseTime(time, '{y}{m}{d}')
        // 拼接目录+文件名
        const path = `suyuan/${dir}/${d}/${uuid}`;
        // 上传
        const result = await client.put(path, file)
        // console.warn(result);
        successCallback({ name: fileName, url: path, })
    } catch (e) {
        console.warn(e)
    }
}